module.exports = ({ whiteList }) => {
    // 导出一个中间件函数
    return async (ctx, next) => {
        if (whiteList.includes(ctx.path)) {
            await next();
            // 否则就要校验 token
        } else {
            // 获取 token 字段
            const token = ctx.headers.token;
            if (!token) {
                ctx.body = {
                    code: 401,
                    message: 'token 不存在',
                };
                return;
            }
            // 校验token合法性
            try {
                // id, username, nickname
                let user = ctx.helper.checkToken(token);
                // console.log('auth user', user);
                // 挂载到 ctx 对象上，以便在 controller、service 中使用
                ctx.user = user;
            } catch (error) {
                if (error.name === 'TokenExpiredError') {
                    ctx.body = {
                        code: 401,
                        message: 'token 过期，请重新登录',
                    };
                    return;
                }
                if (error.name === 'JsonWebTokenError') {
                    ctx.body = {
                        code: 401,
                        message: 'token 无效',
                    };
                    return;
                }
            }
            // 放行
            await next();
        }
    };
};
